<?php

namespace Api\Member\AuthManager;

use Api\RouteRegistrar;
use Illuminate\Support\ServiceProvider as BaseServiceProvider;

/**
 * 服务提供者
 */
class ServiceProvider extends BaseServiceProvider
{
    /**
     * 权限服务标识
     * 
     * @var string
     */
    private $authProvidersKey;

    /**
     * 服务注册时执行，此处仅可用于注册 Ioc 绑定
     * 
     * @return void
     */
    public function register()
    {
        // 注册配置文件
        config()->set('Member\AuthManager', require __DIR__.'/config.php');
        
        // 利用路由登记员自动计算认证服务标识
        $this->authProvidersKey = $this->app->make(RouteRegistrar::class)->getAuthProvidersKeyByGroup('memberManager');
        
        // 注册 Ioc 绑定
        $this->app->when(Auth::class)
            ->needs('$authProviderKey')
            ->give($this->authProvidersKey);
        
        // 注册 Ioc 绑定
        $this->app->when(Open\ManagerRepository::class)
            ->needs('$config')
            ->give(config('Member\AuthManager'));
        
        // 注册 Ioc 绑定
        $this->app->when(Open\ManagerRepository::class)
            ->needs('$authProviderKey')
            ->give($this->authProvidersKey);
    }
    
    /**
     * 服务启动时执行
     * 
     * @param  \Api\RouteRegistrar $api
     * @return void
     */
    public function boot(RouteRegistrar $api)
    {
        // 注册路由
        $this->registRoute($api);
        
        // JWT Auth
        app('Dingo\Api\Auth\Auth')->extend($this->authProvidersKey, function () {
           return app(JWTAuthProvider::class);
        });
    }

    /**
     * 注册路由
     * 
     * @param  \Api\RouteRegistrar $api
     * @return void
     */
    private function registRoute(RouteRegistrar $api)
    {
        // 后台开放
        $api->memberManager('v1', function ($api) {

            // // 重置密码
            // $api->post('reset-password' , Open\Controller::class.'@resetPassword');
            // // 发送短信验证码（重置密码）
            // $api->get('reset-password-verification-code' , Open\Controller::class.'@sendResetPasswordVerificationCode');

            // 发送短信验证码（登录）
            $api->get('login-verification-code' , Open\Controller::class.'@sendLoginVerificationCode');

            // 登录，创建 token
            $api->post('tokens' , Open\Controller::class.'@login');
            // 刷新 token
            $api->patch('token' , Open\Controller::class.'@refreshToken');
            // 登出，废弃 token
            $api->delete('token', Open\Controller::class.'@logout');

            // 日志查看
            $api->get('lumen.log', Self\LogViewerController::class.'@index');

        });

        // 后台登陆后可用
        $api->memberManagerAuth('v1', function ($api) {

            // 当前账号管理
            $api->group(['prefix' => 'self'], function ($api) {

                // 获取当前账号信息
                $api->get('', Self\Controller::class.'@getSelf');
                // 修改当前账号登录密码
                // $api->patch('password', Self\Controller::class.'@changePassword');
                // 管理员列表
                $api->get('manager-list', Self\Controller::class.'@managerList');
                // 管理员添加
                $api->post('manager-add', Self\Controller::class.'@managerAdd');
                // 管理员编辑
                $api->post('manager-edit/{id}', Self\Controller::class.'@managerEdit');
                // 管理员删除
                $api->delete('manager-delete/{id}', Self\Controller::class . '@managerDelete');
            });

        });

    }

}
